/*
洛谷1019
单词接龙是一个与我们经常玩的成语接龙相类似的游戏，现在我们已知一组单词，
且给定一个开头的字母，要求出以这个字母开头的最长的“龙”（每个单词都最多在“龙”中出现两次），
在两个单词相连时，其重合部分合为一部分，例如 beast 和 astonish，如果接成一条龙则变为 beastonish，
另外相邻的两部分不能存在包含关系，例如 at 和 atide 间不能相连。

输入格式
输入的第一行为一个单独的整数 nn 表示单词数，以下 nn 行每行有一个单词，
输入的最后一行为一个单个字符，表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在。

输出格式
只需输出以此字母开头的最长的“龙”的长度。

输入输出样例
输入 
5
at
touch
cheat
choose
tact
a
输出 
23

样例解释：连成的“龙”为 atoucheatactactouchoose
*/
#include<bits/stdc++.h>
using namespace std;
int n;
int ans;
string a[22];//放每个单词
int vis[22];//放每个单词用了几次
//x表示目前正在接龙的单词(而不是已经接龙了的单词，因为已经接龙了的单词的前面一些并没有用)，
//s表示目前已经接龙的字符串有多长
void dfs(string x,int s){
	ans=max(ans,s);//每次都要更新答案
	for(int i=1;i<=n;i++){
    //这里的循环是，选每一个a[i]，把它往x上加
		int p=1;//p来截取x(也就是前一个字符串)的最后几个字母，从1开始，不断往上加
		int la=x.length(),lb=a[i].length();
        //这里是测x和a[i]的最大重叠部分，当P==lb时，说明两个字符串中有一个会把另一个覆盖
		while(p<min(la,lb)){
            //截取x的后面，a[i]的前面，并且vis[i]的访问次数要小于两次
			if(x.substr(la-p)==a[i].substr(0,p)&&vis[i]<2){
                //如果找到了符合条件的字符串，就继续dfs
				vis[i]++;
                //从当前接上了的单词继续dfs
				dfs(a[i],s+lb-p);	
				vis[i]--;
				//break;
                //这里不写break也可以
			}
			p++;
		}
	}
}
int main(){   
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	char t;cin>>t;
	for(int i=1;i<=n;i++){
		if(a[i][0]==t){//如果a[i]的第一个字母等于t，就进入dfs
			vis[i]++;
			dfs(a[i],a[i].length());
			vis[i]--;
		}
	}
	cout<<ans;
	return 0;
} 







